﻿/**
 * @file NisLinkGeoAdasCommon_Struct.h
 * @brief NisLinkGeoAdasCommon
 * @details 
 * @mainpage http://www.navinfo.com/
 * @author Navinfo
 * @email 400-810-0880
 * @license Navinfo Co.,Ltd. All rights reserved
 */
#ifndef	__NISLINKGEOADASCOMMONSTRUCT_H_
#define	__NISLINKGEOADASCOMMONSTRUCT_H_

PRAGMA_PACK_PUSH

namespace Navinfo {
namespace Nis {

class CAdasPoint;
class CAdasRoadMedian;
class CAdasRoadMedianSet;

/**
 * @brief SUPER_ELEVATION_CLASS
 * 
 */
enum SUPER_ELEVATION_CLASS {
	SUPER_ELEVATION_CLASS_FLAT,	///<	横坡（tan*100%)大于等于-4%，小于4%
	SUPER_ELEVATION_CLASS_MORE_THAN_4_TOWARDS_CURB,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左低右高时，横坡（tan*100%)大于等于4%，小于6%；
	SUPER_ELEVATION_CLASS_MORE_THAN_6_TOWARDS_CURB,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左低右高时，横坡（tan*100%)大于等于6%，小于8%；
	SUPER_ELEVATION_CLASS_MORE_THAN_8_TOWARDS_CURB,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左低右高时，横坡（tan*100%)大于等于8%；
	SUPER_ELEVATION_CLASS_MORE_THAN_4_TOWARDS_MIDDLE,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左高右低时，横坡（tan*100%)大于等于-6%，小于-4%；
	SUPER_ELEVATION_CLASS_MORE_THAN_6_TOWARDS_MIDDLE,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左高右低时，横坡（tan*100%)大于等于-8%，小于-6%；
	SUPER_ELEVATION_CLASS_MORE_THAN_8_TOWARDS_MIDDLE,	///<	沿通行方向(双向路, 则按照数字化方向, 即南西原则确定)，道路左高右低时，横坡（tan*100%)小于-8%；
};
/**
 * @brief ROAD_MEDIAN_SHAPE
 * 
 */
enum ROAD_MEDIAN_SHAPE {
	ROAD_MEDIAN_SHAPE_FLAT,	///<	中间带在一个水平面上
	ROAD_MEDIAN_SHAPE_BERM,	///<	中间带有凸起的堤岸、阶地、山脊或类似物
	ROAD_MEDIAN_SHAPE_DITCH,	///<	中间带有凹陷的沟渠
};
/**
 * @brief ROAD_MEDIAN_SURFACE
 * 
 */
enum ROAD_MEDIAN_SURFACE {
	ROAD_MEDIAN_SURFACE_PAVED = 0,	///<	中央带表面被铺设
	ROAD_MEDIAN_SURFACE_UNPAVED = 1,	///<	中央带表面没有被铺设
};


/**
 * @brief 属性点
 * 
 */
class DLL_PUBLIC CAdasPoint
{
public:
	CAdasPoint();

	explicit CAdasPoint(
		  const Navinfo::Nis::CCoord2D &m_clCoord_
		, const uchar &m_ucCurvatureFlag_ = 0
		, const uchar &m_ucSlopeFlag_ = 0
		, const uchar &m_ucSuperElevationFlag_ = 0
		, const int &m_iCurvature_ = 0
		, const int &m_iSlope_ = 0
		, const uchar &m_ucSuperElevation_ = 0
		);

public:
	/**
	 * @brief 取得Coord
	 *
	 * @return 属性Point的位置
	 */
	const Navinfo::Nis::CCoord2D& GetCoord() const;

	/**
	 * @brief 取得Curvature
	 *
	 * @return 该Point的曲率值，单位为 1000000/m 
	 */
	const int& GetCurvature() const;

	/**
	 * @brief 取得Slope
	 *
	 * @return 该Point的纵坡值（道路坡角的 tan值）扩大1000倍。
	 */
	const int& GetSlope() const;

	/**
	 * @brief 取得CurvatureFlag
	 *
	 * @return 该Point是否有曲率值
	 */
	Navinfo::Nis::BOOL GetCurvatureFlag() const;

	/**
	 * @brief 取得SlopeFlag
	 *
	 * @return 该Point是否有纵坡
	 */
	Navinfo::Nis::BOOL GetSlopeFlag() const;

	/**
	 * @brief 取得SuperElevationFlag
	 *
	 * @return 该Point是否有横坡
	 */
	Navinfo::Nis::BOOL GetSuperElevationFlag() const;

	/**
	 * @brief 取得SuperElevation
	 *
	 * @return 该点的横坡值，例如平坦
	 */
	SUPER_ELEVATION_CLASS GetSuperElevation() const;


public:
	Navinfo::Nis::CCoord2D										m_clCoord;									///<	  属性Point的位置  
	int															m_iCurvature;								///<	  该Point的曲率值，单位为 1000000/m   
	int															m_iSlope;									///<	  该Point的纵坡值（道路坡角的 tan值）扩大1000倍。  
	uchar														m_ucCurvatureFlag;							///<	  该Point是否有曲率值  
	uchar														m_ucSlopeFlag;								///<	  该Point是否有纵坡  
	uchar														m_ucSuperElevationFlag;						///<	  该Point是否有横坡  
	uchar														m_ucSuperElevation;							///<	  该点的横坡值，例如平坦  
};


/**
 * @brief 道路的中央分隔带
 * 
 */
class DLL_PUBLIC CAdasRoadMedian
{
public:
	CAdasRoadMedian();

	explicit CAdasRoadMedian(
		  const uchar &m_ucValidityRangeFlag_
		, const ushort &m_usWidth_ = 0
		, const uchar &m_ucRoadMedianSurface_ = 0
		, const Navinfo::Nis::CPathRange &m_clValidityRange_ = Navinfo::Nis::CPathRange()
		);

public:
	/**
	 * @brief 取得ValidityRange
	 *
	 * @return ValidityRange
	 */
	const Navinfo::Nis::CPathRange& GetValidityRange() const;

	/**
	 * @brief 取得Width
	 *
	 * @return 道路中央分隔带的宽度，单位是分米
	 */
	const ushort& GetWidth() const;

	/**
	 * @brief 取得ValidityRangeFlag
	 *
	 * @return ValidityRangeFlag表示是否有ValidityRange；ValidityRangeFlag=True的场合，表示在ValidityRange范围内存在道路中央分隔带。ValidityRangeFlag=False的场合，表示整条道路存在道路中央分隔带情报。
	 */
	Navinfo::Nis::BOOL GetValidityRangeFlag() const;

	/**
	 * @brief 取得RoadMedianSurface
	 *
	 * @return 中间带表面，包括 中央带表面铺设、中央带表面没被铺设
	 */
	ROAD_MEDIAN_SURFACE GetRoadMedianSurface() const;


public:
	Navinfo::Nis::CPathRange									m_clValidityRange;							///<	  ValidityRange  
	ushort														m_usWidth;									///<	  道路中央分隔带的宽度，单位是分米  
	uchar														m_ucValidityRangeFlag;						///<	  ValidityRangeFlag表示是否有ValidityRange；ValidityRangeFlag=True的场合，表示在ValidityRange范围内存在道路中央分隔带。ValidityRangeFlag=False的场合，表示整条道路存在道路中央分隔带情报。  
	uchar														m_ucRoadMedianSurface;						///<	  中间带表面，包括 中央带表面铺设、中央带表面没被铺设  
};


/**
 * @brief 道路的中央分隔带情报
 * 
 */
class DLL_PUBLIC CAdasRoadMedianSet
{
public:
	CAdasRoadMedianSet();

	explicit CAdasRoadMedianSet(
		  const vector< CAdasRoadMedian > &m_vclLeft_
		, const vector< CAdasRoadMedian > &m_vclRight_ = vector< CAdasRoadMedian >()
		);

public:
	/**
	 * @brief 取得Left的数量
	 *
	 * @return Left的数量
	 */
	size_t GetNumLeft() const;

	/**
	 * @brief 取得数组Left中下标为iNo的元素
	 * @details 
	 *
	 * @return 道路的左侧中央分隔带情报
	 */
	const CAdasRoadMedian& GetLeft( size_t iNo ) const;

	/**
	 * @brief 取得Left
	 *
	 * @return 道路的左侧中央分隔带情报
	 */
	const vector< CAdasRoadMedian >& GetLeft() const;

	/**
	 * @brief 取得Right的数量
	 *
	 * @return Right的数量
	 */
	size_t GetNumRight() const;

	/**
	 * @brief 取得数组Right中下标为iNo的元素
	 * @details 
	 *
	 * @return 道路的右侧中央分隔带情报
	 */
	const CAdasRoadMedian& GetRight( size_t iNo ) const;

	/**
	 * @brief 取得Right
	 *
	 * @return 道路的右侧中央分隔带情报
	 */
	const vector< CAdasRoadMedian >& GetRight() const;


public:
	vector< CAdasRoadMedian >									m_vclLeft;									///<	  道路的左侧中央分隔带情报  
	vector< CAdasRoadMedian >									m_vclRight;									///<	  道路的右侧中央分隔带情报  
};

}
}

PRAGMA_PACK_POP

#endif	//	__NISLINKGEOADASCOMMONSTRUCT_H_
